home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / dev / e / amigae21b.lha / Amiga_E_v2.1b / Sources / Utilities / ShowHunk.e < prev    next >
Text File  |  1992-09-02  |  25KB  |  876 lines

  1. /* simple hunk-dump program with 680x0 disassembler for code hunks */
  2.  
  3. /*
  4.    WARNING: hunk_reloc32_short and hunk_relative_reloc hunks have not been
  5.    tested. If you find a file with this type of hunk, and this program
  6.    doesn't work with it, *PLEASE* contact the program authors so fixes may
  7.    be made.
  8. */
  9.  
  10. OPT OSVERSION=37
  11.  
  12. ENUM HUNK_UNIT=$3E7, HUNK_NAME, HUNK_CODE, HUNK_DATA, HUNK_BSS, HUNK_RELOC32,
  13.      HUNK_RELOC16, HUNK_RELOC8, HUNK_EXT, HUNK_SYMBOL, HUNK_DEBUG,
  14.      HUNK_END, HUNK_HEADER, HUNK_OVERLAY=$3F5, HUNK_BREAK, HUNK_DRELOC32,
  15.      HUNK_DRELOC16, HUNK_DRELOC8, HUNK_LIB, HUNK_INDEX, HUNK_RELOC32_S,
  16.      HUNK_REL_RELOC32
  17.  
  18. ENUM EXT_SYM=0, EXT_DEF, EXT_ABS, EXT_RES, EXT_NEWCOMMON, EXT_REF32=129,
  19.      EXT_COMMON, EXT_REF16, EXT_REF8, EXT_DREF32, EXT_DREF16, EXT_DREF8
  20.  
  21. ENUM ER_NONE,ER_FILE,ER_MEM,ER_USAGE,ER_HUNKID,ER_BREAK,ER_FILETYPE
  22.  
  23. DEF flen,o:PTR TO LONG,mem,handle=NIL,hunkid,noreloc=TRUE,hunknr=-1,f=TRUE
  24. DEF pc:PTR TO INT,hibyte,eleven2nine,eight,seven2six,five2three,two2zero,isize
  25. DEF tmp,fname[256]:STRING,disasm
  26.  
  27. PROC main()
  28.   DEF options:PTR TO LONG,rdargs
  29.  
  30.   options:=[0,0]
  31.   IF rdargs:=ReadArgs('NAME/A,DISASM/S',options,NIL)
  32.     IF options[0] THEN StrCopy(fname,options[0],ALL)
  33.     disasm:=options[1]
  34.     FreeArgs(rdargs)
  35.   ELSE
  36.     error(ER_USAGE)
  37.   ENDIF
  38.  
  39.   WriteF('ShowHunk v2.0 Copyright (c) 1993 Jim Cooper\n')
  40.   WriteF(' Original ShowHunk v0.1 (c) 1992 $#%!\n\n')
  41.  
  42.   flen:=FileLength(fname)
  43.   handle:=Open(fname,OLDFILE)
  44.   IF (flen<1) OR (handle=NIL)
  45.     error(ER_FILE)
  46.   ELSE
  47.     mem:=New(flen)
  48.     IF mem=NIL
  49.       error(ER_MEM)
  50.     ELSE
  51.       IF Read(handle,mem,flen)<>flen THEN error(ER_FILE) ELSE process()
  52.     ENDIF
  53.   ENDIF
  54.   error(ER_NONE)
  55. ENDPROC
  56.  
  57. PROC process()
  58.   DEF end,type
  59.  
  60.   o:=mem
  61.   end:=o+flen
  62.   IF (o[]<>HUNK_HEADER) AND (o[]<>HUNK_UNIT) AND (o[]<>HUNK_LIB) THEN error(ER_FILETYPE)
  63.   WriteF('Hunk layout of file "\s" (\d bytes)\n\n',fname,flen)
  64.   WHILE o<end
  65.     IF CtrlC() THEN error(ER_BREAK)
  66.     type:=Int(o); hunkid:=Int(o+2); o:=o+4
  67.     IF (hunkid<>HUNK_UNIT) AND (hunkid<>HUNK_HEADER) AND (hunkid<>HUNK_BREAK) AND (hunkid<>HUNK_LIB) AND (hunkid<>HUNK_INDEX)
  68.       IF f
  69.         WriteF('HUNK \d',hunknr)
  70.         INC hunknr
  71.       ENDIF
  72.       f:=FALSE
  73.     ENDIF
  74.     IF type
  75.       IF type=$4000
  76.         WriteF('\t** hunk forced to CHIP-mem\n')
  77.       ELSE
  78.         WriteF('\t** type: \d\n',type)
  79.       ENDIF
  80.     ENDIF
  81.     SELECT hunkid
  82.       CASE HUNK_UNIT;        WriteF('\thunk_unit: '); name()
  83.       CASE HUNK_NAME;        WriteF('\thunk_name: '); name()
  84.       CASE HUNK_CODE;
  85.         WriteF('\thunk_code')
  86.         IF disasm
  87.           WriteF('\n'); code()
  88.         ELSE
  89.           WriteF(': \d bytes\n', skip())
  90.         ENDIF
  91.       CASE HUNK_DATA;        WriteF('\thunk_data: \d bytes\n',skip())
  92.       CASE HUNK_BSS;         WriteF('\thunk_bss: \d bytes\n',Mul(o[]++,4))
  93.       CASE HUNK_RELOC32;     WriteF('\thunk_reloc32\n'); reloc(4)
  94.       CASE HUNK_RELOC16;     WriteF('\thunk_reloc16\n'); reloc(4)
  95.       CASE HUNK_RELOC8;      WriteF('\thunk_reloc8\n'); reloc(4)
  96.       CASE HUNK_EXT;         WriteF('\thunk_ext\n'); symbol()
  97.       CASE HUNK_SYMBOL;      WriteF('\thunk_symbol\n'); symbol()
  98.       CASE HUNK_DEBUG;       WriteF('\thunk_debug: \d bytes\n',skip())
  99.       CASE HUNK_END;         f:=TRUE
  100.       CASE HUNK_HEADER;      WriteF('\thunk_header\n'); head()
  101.       CASE HUNK_OVERLAY;     WriteF('\thunk_overlay\n'); overlay()
  102.       CASE HUNK_BREAK;       WriteF('\thunk_break\n'); hunknr:=1; f:=TRUE
  103.       CASE HUNK_DRELOC32;    WriteF('\thunk_data-reloc32\n'); reloc(4)
  104.       CASE HUNK_DRELOC16;    WriteF('\thunk_data-reloc16\n'); reloc(4)
  105.       CASE HUNK_DRELOC8;     WriteF('\thunk_data-reloc8\n'); reloc(4)
  106.       CASE HUNK_LIB;         WriteF('\tlibrary_hunk: \d bytes\n',Mul(o[]++,4)); hunknr:=0
  107.       CASE HUNK_INDEX;       WriteF('\tlibrary_index: \d bytes\n\n',skip())
  108.       CASE HUNK_RELOC32_S;   WriteF('\thunk_reloc32_short\n'); reloc(2);
  109.       CASE HUNK_REL_RELOC32; WriteF('\thunk_relative_reloc32\n'); reloc(4);
  110.       DEFAULT
  111.         error(ER_HUNKID)
  112.     ENDSELECT
  113.   ENDWHILE
  114.   IF noreloc THEN WriteF('\nPosition independant code!\n') ELSE WriteF('\n')
  115. ENDPROC
  116.  
  117. PROC overlay()
  118.   DEF m,ts
  119.   ts:=o[]++
  120.   WriteF('\t  tablesize = \d\n',ts)
  121.   m:=o[]++-2
  122.   WriteF('\t  max. level overlay tree uses = \d\n',m)
  123.   o:=ts*4+o
  124.   hunknr:=1; f:=TRUE
  125. ENDPROC
  126.  
  127. PROC symbol()
  128.   DEF t,l,s,c,r
  129.   t:=Char(o); l:=Int(o+2); o:=o+4
  130.   WHILE l
  131.     IF CtrlC() THEN error(ER_BREAK)
  132.     IF t<EXT_NEWCOMMON                  /* sym def */
  133.       s:=o; o:=l*4+o; c:=o[]++; PutChar(o-4,0)
  134.       WriteF('\t  \s = $\h\n',s,c)
  135.     ELSEIF t=EXT_COMMON OR t=EXT_NEWCOMMON  /* common ref */
  136.       s:=o; o:=l*4+o; c:=o[]++; PutChar(o-4,0); r:=o[]++
  137.       WriteF('\t  \s (\d ref\s) commonsize = \d\n',s,r,
  138.              IF r=1 THEN '' ELSE 's',c)
  139.       o:=r*4+o
  140.     ELSE                                /* sym ref */
  141.       s:=o; o:=l*4+o; r:=o[]++; PutChar(o-4,0)
  142.       WriteF('\t  \s (\d ref\s)\n',s,r,IF r=1 THEN '' ELSE 's')
  143.       o:=r*4+o
  144.     ENDIF
  145.     t:=Char(o); l:=Int(o+2); o:=o+4
  146.   ENDWHILE
  147. ENDPROC
  148.  
  149. PROC head()
  150.   DEF a,b
  151.   a:=0
  152.   b:=o[a]++
  153.   WHILE b
  154.     WriteF('\t  libname: \s\n',o)
  155.     a:=a+b
  156.     b:=o[a]++
  157.   ENDWHILE
  158.   b:=o[]++
  159.   hunknr:=o[]++
  160.   a:=o[]++-hunknr+1
  161.   WriteF('\t  #of hunks: \d\n',a)
  162.   o:=a*4+o
  163. ENDPROC
  164.  
  165. PROC reloc(size)
  166.   DEF a
  167.   noreloc:=FALSE
  168.   a:=o[]++
  169.   WHILE a
  170.     IF CtrlC() THEN error(ER_BREAK)
  171.     WriteF('\t  \d reloc entr\s for hunk #\d\n',a,
  172.            IF a=1 THEN 'y' ELSE 'ies',o[]++)
  173.     o:=a*size+o
  174.     a:=o[]++
  175.   ENDWHILE
  176. ENDPROC
  177.  
  178. PROC name()
  179.   DEF a
  180.   a:=o[]++
  181.   WriteF('\s\n',o)
  182.   o:=a*4+o
  183. ENDPROC
  184.  
  185. PROC skip()
  186.   DEF a
  187.   a:=Mul(o[]++,4)
  188.   o:=o+a
  189. ENDPROC a
  190.  
  191. PROC error(nr)
  192.   IF handle THEN Close(handle)
  193.   WriteF('\n')
  194.   SELECT nr
  195.     CASE ER_FILE;     WriteF('Could not read file "\s" !\n',fname)
  196.     CASE ER_MEM;      WriteF('No memory for hunks!\n')
  197.     CASE ER_USAGE;    WriteF('USAGE: ShowHunk <exe/objfile>\n')
  198.     CASE ER_HUNKID;   WriteF('Illegal hunk id: $\h !\n',hunkid)
  199.     CASE ER_BREAK;    WriteF('** BREAK: ShowHunk\n')
  200.     CASE ER_FILETYPE; WriteF('Not an executable or object file.\n')
  201.   ENDSELECT
  202.   CleanUp(0)
  203. ENDPROC
  204.  
  205. PROC illegal()
  206.   WriteF('<illegal opcode: $\h>\n',pc[])
  207. ENDPROC
  208.  
  209. PROC opsize(bit) RETURN ListItem(["b","w","l","?"],bit)
  210.  
  211. PROC bitsize(bit) RETURN IF bit THEN "l" ELSE "w"
  212.  
  213. /*
  214. PROC bitsize(bit)
  215. ENDPROC ListItem(["w","l"],bit)
  216. */
  217.  
  218. PROC immed(val)
  219.   WriteF(IF val < 16 THEN '\d' ELSE '$\h',val)
  220. ENDPROC
  221.  
  222. PROC ccode(val,b) RETURN ListItem([IF b THEN 'ra' ELSE 't',
  223.   IF b THEN 'sr' ELSE 'f','hi','ls','cc','cs','ne','eq','vc',
  224.   'vs','pl','mi','ge','lt','gt','le','??'],val)
  225.  
  226. /*
  227. PROC ccode(val,b)
  228.   IF val = 0
  229.     RETURN IF b THEN 'ra' ELSE 't'
  230.   ELSEIF val = 1
  231.     RETURN IF b THEN 'sr' ELSE 'f'
  232.   ELSE
  233.     RETURN ListItem(['hi','ls','cc','cs','ne','eq','vc','vs','pl','mi','ge','lt'
  234. ,'gt','le'],val-2)
  235.   ENDIF
  236. ENDPROC '??'
  237. */
  238.  
  239. PROC ea(mode,reg,sd)
  240.   IF mode < 5 THEN
  241.     WriteF(ListItem(['d\d','a\d','(a\d)','(a\d)+','-(a\d)'],mode),reg)
  242.   SELECT mode
  243.     CASE 5;
  244.        WriteF('(')
  245.        immed(pc[1]++)
  246.        WriteF(',a\d)',reg)
  247.     CASE 6;
  248.       tmp:=pc[1]++
  249.       WriteF('(')
  250.       immed(tmp AND $f)
  251.       WriteF(',a\d,\s\d\s',reg,
  252.                            IF tmp AND $8000 THEN 'a' ELSE 'd',
  253.                            (Shr(tmp,12) AND 7),
  254.                            IF tmp AND $800 THEN '.L)' ELSE '.W)')
  255.     CASE 7;
  256.       SELECT reg
  257.         CASE 0;  WriteF('(\d).W',pc[1]++)
  258.         CASE 1;  immed(^pc++)
  259.         CASE 2;
  260.           WriteF('(')
  261.           immed(pc[1]++)
  262.           WriteF(',PC)')
  263.         CASE 3;
  264.           tmp:=pc[1]++
  265.           WriteF('(')
  266.           immed(tmp AND $f)
  267.           WriteF(',PC,\c\d\s',IF tmp AND $8000 THEN "a" ELSE "d",
  268.                               (Shr(tmp,12) AND 7),
  269.                               IF tmp AND $800 THEN '.L)' ELSE '.W)')
  270.         CASE 4;
  271.           IF sd
  272.             WriteF('#')
  273.             immed(IF isize=2 THEN pc[1] ELSE Long(pc+2))
  274.             pc:=pc+isize
  275.           ELSE
  276.             WriteF('SR')
  277.           ENDIF
  278.         DEFAULT;
  279.           WriteF('<unknown ea!>')
  280.       ENDSELECT
  281.   ENDSELECT
  282. ENDPROC
  283.  
  284. PROC movemregs(val,predec)
  285.   DEF index,first=1,regs:PTR TO LONG
  286.  
  287.   regs:=['d0','d1','d2','d3','d4','d5','d6','d7',
  288.          'a0','a1','a2','a3','a4','a5','a6','a7']
  289.  
  290.   IF predec
  291.     FOR index:=15 TO 0 STEP -1
  292.       IF val AND Shl(1,index)
  293.         IF first = 0 THEN WriteF('/')
  294.         WriteF(regs[15-index])
  295.         first:=0
  296.       ENDIF
  297.     ENDFOR
  298.   ELSE
  299.     FOR index:=0 TO 15 STEP 1
  300.       IF val AND Shl(1,index)
  301.         IF first = 0 THEN WriteF('/')
  302.         WriteF(regs[index])
  303.         first:=0
  304.       ENDIF
  305.     ENDFOR
  306.   ENDIF
  307. ENDPROC
  308.  
  309. PROC code0000()
  310.   DEF c,tmp2
  311.  
  312.   IF (eleven2nine = 7) OR (seven2six = 3)
  313.     IF (eleven2nine = 7) AND (eight = 0)
  314.       tmp:=pc[1]++
  315.       WriteF('moves.\c\t',opsize(seven2six))
  316.       IF Shr(tmp,11) AND 1
  317.         ea(five2three,two2zero,1)
  318.         WriteF(',\c\d\n',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
  319.       ELSE
  320.         WriteF('\c\d,',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
  321.         ea(five2three,two2zero,0)
  322.         WriteF('\n')
  323.       ENDIF
  324.     ELSEIF (eight = 0) AND (seven2six = 3)
  325.       tmp:=pc[1]++
  326.       IF (five2three = 7) AND (two2zero = 4)
  327.         tmp2:=pc[1]++
  328.         WriteF('cas2\td\d:d\d,d\d:d\d,\c\d:\c\d\n',
  329.                (tmp AND 7), (tmp2 AND 7),
  330.                (Shr(tmp,6) AND 7), (Shr(tmp2,6) AND 7),
  331.                IF tmp AND $8000 THEN "a" ELSE "d", (Shr(tmp,12) AND 7),
  332.                IF tmp2 AND $8000 THEN "a" ELSE "d", (Shr(tmp2,12) AND 7))
  333.       ELSE
  334.         WriteF('cas\td\d,d\d,',tmp AND 7, Shr(tmp,6) AND 7)
  335.         ea(five2three,two2zero,0)
  336.         WriteF('\n')
  337.       ENDIF
  338.     ELSE
  339.       illegal()
  340.     ENDIF
  341.   ELSE
  342.     IF five2three = 1
  343.       WriteF('movep.\c\t',bitsize(seven2six AND 1))
  344.       IF seven2six AND 2
  345.         WriteF('d\d,\d(a\d)\n',eleven2nine,pc[1]++,two2zero)
  346.       ELSE
  347.         WriteF('\d(a\d),d\d\n',pc[1]++,two2zero,eleven2nine)
  348.       ENDIF
  349.     ELSEIF (eight = 1) OR ((((eleven2nine AND 3) = 0) AND (eight = 0)))
  350.       WriteF(ListItem(['btst\t','bchg\t','bclr\t','bset\t'],seven2six))
  351.       IF eight = 1
  352.         WriteF('d\d,',eleven2nine)
  353.       ELSE
  354.         WriteF('#\d,',pc[1]++)
  355.       ENDIF
  356.       ea(five2three,two2zero,0)
  357.       WriteF('\n')
  358.     ELSE
  359.       IF seven2six = 3
  360.         tmp:=pc[1]++
  361.         WriteF('\s.\c\t',IF Shr(tmp,11) AND 1 THEN 'chk2' ELSE 'cmp2',opsize(eleven2nine))
  362.         ea(five2three,two2zero,1)
  363.         WriteF(',\c\d\n',IF tmp AND $8000 THEN "d" ELSE "a",Shr(tmp,12) AND 3)
  364.       ELSE
  365.         c:=ListItem(['ori.','andi.','subi.','addi.',0,'eori.','cmpi.',0],eleven2nine)
  366.         IF c THEN WriteF(c) ELSE illegal()
  367.         WriteF('\c\t#',opsize(seven2six))
  368.         immed(IF seven2six < 2 THEN pc[1]++ ELSE ^pc++)
  369.         WriteF(',')
  370.         ea(five2three,two2zero,0)
  371.         WriteF('\n')
  372.       ENDIF
  373.     ENDIF
  374.   ENDIF
  375. ENDPROC
  376.  
  377. PROC code0100()
  378.   DEF subfield,bitseven,bitsix,curcode
  379.  
  380.   bitseven:=Shr(seven2six,1)
  381.   bitsix:=seven2six AND 1
  382.  
  383.   IF pc[] = $4afa
  384.     WriteF('bgnd\n')
  385.   ELSE
  386.     IF eight = 1
  387.       IF bitsix = 1
  388.         WriteF('lea\t')
  389.         ea(five2three,two2zero,1)
  390.         WriteF(',a\d\n',eleven2nine)
  391.       ELSE
  392.         WriteF('chk\t')
  393.         ea(five2three,two2zero,0)
  394.         WriteF(',d\d\n',eleven2nine)
  395.       ENDIF
  396.     ELSE
  397.       subfield:=Shl(eleven2nine,1)+eight
  398.  
  399.       SELECT subfield
  400.         CASE 0;
  401.           IF seven2six = 3
  402.             WriteF('move.w\t')
  403.             ea(five2three,two2zero,1)
  404.             WriteF(',sr\n')
  405.           ELSE
  406.             WriteF('negx.\c\t',opsize(seven2six))
  407.             ea(five2three,two2zero,0)
  408.             WriteF('\n')
  409.           ENDIF
  410.         CASE 1;
  411.           IF seven2six = 3
  412.             WriteF('move.w\tccr,')
  413.             ea(five2three,two2zero,0)
  414.             WriteF('\n')
  415.           ELSE
  416.             illegal()
  417.           ENDIF
  418.         CASE 2;
  419.           WriteF('clr.\c\t',opsize(seven2six))
  420.           ea(five2three,two2zero,0)
  421.           WriteF('\n')
  422.         CASE 4;
  423.           IF seven2six = 3
  424.             WriteF('move.w\t')
  425.             ea(five2three,two2zero,1)
  426.             WriteF(',ccr\n')
  427.           ELSE
  428.             WriteF('neg.\c\t',opsize(seven2six))
  429.             ea(five2three,two2zero,0)
  430.             WriteF('\n')
  431.           ENDIF
  432.         CASE 6;
  433.           IF seven2six = 3
  434.             WriteF('move.w\tsr,')
  435.             ea(five2three,two2zero,0)
  436.             WriteF('\n')
  437.           ELSE
  438.             WriteF('not.\c\t',opsize(seven2six))
  439.             ea(five2three,two2zero,0)
  440.             WriteF('\n')
  441.           ENDIF
  442.         CASE 8;
  443.           IF seven2six = 0
  444.             IF five2three = 1
  445.               WriteF('link.l\ta\d,#-$\h\n',two2zero,0-1-^pc++)
  446.             ELSE
  447.               WriteF('nbcd\t')
  448.               ea(five2three,two2zero,0)
  449.               WriteF('\n')
  450.             ENDIF
  451.           ELSEIF seven2six = 1
  452.             IF five2three = 0
  453.               WriteF('swap\td\d\n',two2zero)
  454.             ELSEIF five2three = 1
  455.               WriteF('bkpt\t#\d\n',two2zero)
  456.             ELSE
  457.               WriteF('pea\t')
  458.               ea(five2three,two2zero,0)
  459.               WriteF('\n')
  460.             ENDIF
  461.           ELSE
  462.             IF five2three = 0
  463.               IF (Shl(eight,2)+seven2six) = 7 THEN WriteF('extb.l\td\d\n',two2zero) ELSE WriteF('ext.\c\td\d\n',bitsize(bitsix),two2zero)
  464.             ELSE
  465.               WriteF('movem.\c\t',bitsize(bitsix))
  466.               movemregs(pc[1]++, IF five2three = 4 THEN 1 ELSE 0)
  467.               WriteF(',')
  468.               ea(five2three,two2zero,0)
  469.               WriteF('\n')
  470.             ENDIF
  471.           ENDIF
  472.         CASE 10;
  473.           IF pc[] = $4afc
  474.             WriteF('illegal\n')
  475.           ELSE
  476.             IF seven2six = 3
  477.               WriteF('tas\t')
  478.               ea(five2three,two2zero,0)
  479.               WriteF('\n')
  480.             ELSE
  481.               WriteF('tst.\c\t',opsize(seven2six))
  482.               ea(five2three,two2zero,0)
  483.               WriteF('\n')
  484.             ENDIF
  485.           ENDIF
  486.         CASE 12;
  487.           tmp:=pc[1]++
  488.  
  489.           IF (Shl(eight,2)+seven2six) < 2
  490.             IF seven2six = 1
  491.               WriteF('div\c',IF Shr(tmp,11) AND 1 THEN "s" ELSE "u")
  492.               IF ((Shr(tmp,10) AND 1) = 0) AND ((Shr(tmp,12) AND 7) <> (tmp AND 7))
  493.                 WriteF('l.l\t')
  494.                 ea(five2three,two2zero,1)
  495.                 WriteF(',d\d:d\d\n',Shr(tmp,12) AND 7,tmp AND 7)
  496.               ELSE
  497.                 WriteF('.l\t')
  498.                 ea(five2three,two2zero,1)
  499.                 WriteF(',d\d',Shr(tmp,12) AND 7)
  500.                 IF Shr(tmp,10) AND 1 THEN WriteF(':d\d',tmp AND 7)
  501.                 WriteF('\n')
  502.               ENDIF
  503.             ELSE
  504.               WriteF('mul\c.l\t',IF Shr(tmp,11) AND 1 THEN "s" ELSE "u")
  505.               ea(five2three,two2zero,1)
  506.               WriteF(',d\d',Shr(tmp,12) AND 7)
  507.               IF Shr(tmp,10) AND 1 THEN WriteF(':d\d',tmp AND 7)
  508.               WriteF('\n')
  509.             ENDIF
  510.           ELSE
  511.             WriteF('movem.\c\t',bitsize(bitsix))
  512.             ea(five2three,two2zero,0)
  513.             WriteF(',')
  514.             movemregs(tmp, IF five2three = 4 THEN 1 ELSE 0)
  515.             WriteF('\n')
  516.           ENDIF
  517.         CASE 14;
  518.           curcode:=pc[]
  519.  
  520.           SELECT curcode
  521.             CASE $4e70;
  522.               WriteF('reset\n')
  523.             CASE $4e71;
  524.               WriteF('nop\n')
  525.             CASE $4e72;
  526.               WriteF('stop\n')
  527.             CASE $4e73;
  528.               WriteF('rte\n')
  529.             CASE $4e74;
  530.               WriteF('rtd\t#\d\n',(Shl(pc[1]<32767+1,16)-pc[1]++))
  531.             CASE $4e75;
  532.               WriteF('rts\n')
  533.             CASE $4e76;
  534.               WriteF('trapv\n')
  535.             CASE $4e77;
  536.               WriteF('rtr\n')
  537.             DEFAULT;
  538.               IF bitseven = 1
  539.                 WriteF(IF bitsix = 1 THEN 'jmp\t' ELSE 'jsr\t')
  540.                 ea(five2three,two2zero,0)
  541.                 WriteF('\n')
  542.               ELSE
  543.                 IF bitsix = 1
  544.                   tmp:=Shr(five2three,1)
  545.  
  546.                   SELECT tmp
  547.                     CASE 0;
  548.                       WriteF('trap\t\d\n',(Shl((five2three AND 1),2)+two2zero))
  549.                     CASE 1;
  550.                       IF five2three AND 1
  551.                         WriteF('unlk\ta\d\n',two2zero)
  552.                       ELSE
  553.                         WriteF('link.w\ta\d,#-$\h\n',two2zero,65536-pc[1]); pc++
  554.  
  555.                       ENDIF
  556.                     CASE 2;
  557.                       WriteF(IF five2three AND 1 THEN 'move\tusp,a\d\n' ELSE 'move\ta\d,usp\n',two2zero)
  558.                     CASE 3;
  559.                       WriteF('rtm\t\c\d\n',IF five2three AND 1 THEN "a" ELSE "d",two2zero)
  560.                   ENDSELECT
  561.                 ELSE
  562.                   illegal()
  563.                 ENDIF
  564.               ENDIF
  565.           ENDSELECT
  566.         DEFAULT; illegal()
  567.       ENDSELECT
  568.     ENDIF
  569.   ENDIF
  570. ENDPROC
  571.  
  572. PROC code0101()
  573.   IF seven2six < 3
  574.     WriteF(IF eight = 1 THEN 'subq.' ELSE 'addq.')
  575.     WriteF('\c\t#\d,',opsize(seven2six),eleven2nine)
  576.     ea(five2three,two2zero,0)
  577.     WriteF('\n')
  578.   ELSE
  579.     IF five2three = 1
  580.       WriteF('db\s\td\d,L\z\h[8]\n',
  581.              ccode((Shl(eleven2nine,1)+eight),0),
  582.              two2zero,
  583.              pc-o-2-(Shl(pc[1]<32767+1,16)-pc[1]))
  584.       pc++
  585.     ELSEIF five2three = 7
  586.       WriteF('trap\s',ccode(Shl(eleven2nine,1)+eight,0))
  587.       IF two2zero < 4
  588.         IF two2zero AND 1 THEN WriteF('.w\t#\d',pc[1]++) ELSE WriteF('.l\t#\d',^pc++)
  589.       ENDIF
  590.       WriteF('\n')
  591.     ELSE
  592.       WriteF('s\s\t',ccode(Shl(eleven2nine,1)+eight,0))
  593.       ea(five2three,two2zero,0)
  594.       WriteF('\n')
  595.     ENDIF
  596.   ENDIF
  597. ENDPROC
  598.  
  599. PROC code0110()
  600.   DEF tmp2,ctl:PTR TO LONG
  601.  
  602.   IF (pc[] AND $fffe) = $4e7a
  603.     tmp:=pc[1]++
  604.     tmp2:= tmp AND $fff
  605.     IF tmp2 > 7
  606.       ctl:=ListItem(['usp','vbr','caar','msp','isp','mmusr','urp','srp'],tmp2 - $800)
  607.     ELSE
  608.       ctl:=ListItem(['sfc','dfc','cacr','tc','itt0','itt1','dtt0','dtt1'],tmp2)
  609.     ENDIF
  610.     IF ctl
  611.       WriteF('movec\t')
  612.       IF pc[-1] AND 1
  613.         WriteF('\s,\c\d\n',ctl,IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
  614.       ELSE
  615.         WriteF('\c\d,\s\n',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7,ctl)
  616.       ENDIF
  617.     ELSE
  618.       illegal()
  619.     ENDIF
  620.   ELSE
  621.     WriteF('b\s',ccode((Shl(eleven2nine,1)+eight),1))
  622.     tmp:=Char(pc+1)
  623.     IF tmp = 0
  624.       WriteF('.w\tL\z\h[8]\n',pc-o-2-(Shl(pc[1]<32767+1,16)-pc[1]))
  625.       pc++
  626.     ELSE
  627.       WriteF('.b\tL\z\h[8]\n',pc-o-2-(Shl(tmp<127+1,8)-tmp))
  628.     ENDIF
  629.   ENDIF
  630. ENDPROC
  631.  
  632. PROC code1000()
  633.   IF Shr(five2three,1) = 0
  634.     IF eight
  635.       IF seven2six
  636.         SELECT seven2six
  637.           CASE 1;  WriteF('pack\t')
  638.           CASE 2;  WriteF('unpk\t')
  639.           DEFAULT; illegal()
  640.         ENDSELECT
  641.         WriteF(IF five2three AND 1 THEN '-(a\d),-(a\d),#\d\n' ELSE 'd\d,d\d,#\d\n',two2zero,eleven2nine,pc[1]++)
  642.       ELSE
  643.         WriteF(IF five2three AND 1 THEN 'sbcd\t-(a\d),-(a\d)\n' ELSE 'sbcd\td\d,-d\d\n',two2zero,eleven2nine)
  644.       ENDIF
  645.     ELSE
  646.       illegal()
  647.     ENDIF
  648.   ELSE
  649.     IF seven2six = 3
  650.       WriteF(IF eight = 1 THEN 'divs\t' ELSE 'divu\t')
  651.       ea(five2three,two2zero,1)
  652.       WriteF(',d\d\n',eleven2nine)
  653.     ELSE
  654.       WriteF('or.\c\t',opsize(seven2six))
  655.       IF eight = 1
  656.         WriteF('d\d,',eleven2nine)
  657.         ea(five2three,two2zero,0)
  658.       ELSE
  659.         ea(five2three,two2zero,1)
  660.         WriteF(',d\d',eleven2nine)
  661.       ENDIF
  662.       WriteF('\n')
  663.     ENDIF
  664.   ENDIF
  665. ENDPROC
  666.  
  667. PROC code1001()
  668.   IF seven2six = 3
  669.     WriteF('suba.\c\t',bitsize(eight))
  670.     ea(five2three,two2zero,1)
  671.     WriteF(',a\d\n',eleven2nine)
  672.   ELSE
  673.     IF (Shr(five2three,1) = 0) AND (eight = 1)
  674.       WriteF('subx.\c\t',opsize(seven2six))
  675.       WriteF(IF five2three AND 1 THEN '-(a\d),-(a\d)\n' ELSE 'd\d,d\d\n',two2zero,eleven2nine)
  676.     ELSE
  677.       WriteF('sub.\c\t',opsize(seven2six))
  678.       IF eight = 1
  679.         WriteF('d\d,',eleven2nine)
  680.         ea(five2three,two2zero,0)
  681.         WriteF('\n')
  682.       ELSE
  683.         ea(five2three,two2zero,1)
  684.         WriteF(',d\d\n',eleven2nine)
  685.       ENDIF
  686.     ENDIF
  687.   ENDIF
  688. ENDPROC
  689.  
  690. PROC code1011()
  691.   IF seven2six = 3
  692.     WriteF('cmpa.\c\t',bitsize(eight))
  693.     ea(five2three,two2zero,1)
  694.     WriteF(',a\d\n',eleven2nine)
  695.   ELSE
  696.     IF five2three = 1
  697.       WriteF('cmpm.\c\t(a\d)+,(a\d)+\n',opsize(seven2six),two2zero,eleven2nine)
  698.     ELSE
  699.       IF eight = 1
  700.         WriteF('eor.\c\td\d,',opsize(seven2six),eleven2nine)
  701.         ea(five2three,two2zero,0)
  702.         WriteF('\n')
  703.       ELSE
  704.         WriteF('cmp.\c\t',opsize(seven2six))
  705.         ea(five2three,two2zero,1)
  706.         WriteF(',d\d\n',eleven2nine)
  707.       ENDIF
  708.     ENDIF
  709.   ENDIF
  710. ENDPROC
  711.  
  712. PROC code1100()
  713.   IF seven2six = 3
  714.     WriteF(IF eight = 1 THEN 'mulu.w\t' ELSE 'muls.w\t')
  715.     ea(five2three,two2zero,1)
  716.     WriteF(',d\d\n',eleven2nine)
  717.   ELSE
  718.     IF Shr(five2three,1) <> 0
  719.       WriteF('and.\c\t',opsize(seven2six))
  720.       IF eight = 1
  721.         WriteF('d\d,',eleven2nine)
  722.         ea(five2three,two2zero,0)
  723.         WriteF('\n')
  724.       ELSE
  725.         ea(five2three,two2zero,1)
  726.         WriteF(',d\d\n',eleven2nine)
  727.       ENDIF
  728.     ELSE
  729.       IF seven2six = 0
  730.         WriteF(IF five2three AND 1 THEN 'abcd\t-(a\d),-(a\d)\n' ELSE 'abcd\td\d,d\d\n',two2zero,eleven2nine)
  731.       ELSE
  732.         WriteF('exg\t')
  733.         tmp:=Shl(seven2six,3)+five2three
  734.         IF tmp = 8
  735.           WriteF('d\d,d\d\n',two2zero,eleven2nine)
  736.         ELSEIF tmp = 9
  737.           WriteF('a\d,a\d\n',two2zero,eleven2nine)
  738.         ELSEIF tmp = 17
  739.           WriteF('a\d,d\d\n',two2zero,eleven2nine)
  740.         ELSE
  741.           illegal()
  742.         ENDIF
  743.       ENDIF
  744.     ENDIF
  745.   ENDIF
  746. ENDPROC
  747.  
  748. PROC code1101()
  749.   IF seven2six = 3
  750.     WriteF('adda.\c\t',bitsize(eight))
  751.     ea(five2three,two2zero,1)
  752.     WriteF(',a\d\n',eleven2nine)
  753.   ELSE
  754.     IF (Shr(five2three,1) = 0) AND (eight = 1)
  755.       WriteF('addx.\c\t',opsize(seven2six))
  756.       WriteF(IF five2three AND 1 THEN '-(a\d),-(a\d)\n' ELSE 'd\d,d\d\n',two2zero,eleven2nine)
  757.     ELSE
  758.       WriteF('add.\c\t',opsize(seven2six))
  759.       IF eight = 1
  760.         WriteF('d\d,',eleven2nine)
  761.         ea(five2three,two2zero,0)
  762.         WriteF('\n')
  763.       ELSE
  764.         ea(five2three,two2zero,1)
  765.         WriteF(',d\d\n',eleven2nine)
  766.       ENDIF
  767.     ENDIF
  768.   ENDIF
  769. ENDPROC
  770.  
  771. PROC code1110()
  772.   DEF subfield,tmp2
  773.  
  774.   IF seven2six = 3
  775.     tmp:=pc[1]++
  776.     tmp2:=tmp AND 31
  777.     subfield:=Shl((eleven2nine AND 3),1)+eight
  778.     WriteF(ListItem(['bftst','bfextu','bfchg','bfexts','bfclr','bfffo','bfset','bfins'],subfield))
  779.     WriteF('\t')
  780.     IF subfield = 7 THEN WriteF('d\d,',Shr(tmp,12) AND 7)
  781.     ea(five2three,two2zero,0)
  782.     WriteF(IF Shr(tmp,11) AND 1 THEN '{d\d:' ELSE '{\d:',Shr(tmp,6) AND 31)
  783.     WriteF(IF Shr(tmp,5) AND 1 THEN 'd\d}' ELSE '\d}',IF tmp2 THEN tmp2 ELSE 32)
  784.  
  785.     IF (subfield < 7) AND (subfield AND 1) THEN WriteF(',d\d',Shr(tmp,12) AND 7)
  786.  
  787.     WriteF('\n')
  788.   ELSE
  789.     WriteF('\s\c',ListItem(['as','ls','rox','ro'],IF seven2six=3 THEN eleven2nine ELSE five2three AND 3),IF eight=1 THEN "l" ELSE "r")
  790.     IF seven2six = 3
  791.       WriteF('\t')
  792.       ea(five2three,two2zero,0)
  793.       WriteF('\n')
  794.     ELSE
  795.       WriteF(IF five2three AND 4 THEN '.\c\td\d,d\d\n' ELSE '\c\t#\d,d\d\n',opsize(seven2six),eleven2nine,two2zero)
  796.     ENDIF
  797.   ENDIF
  798. ENDPROC
  799.  
  800. PROC code()
  801.   DEF number
  802.  
  803.   isize:=2
  804.   number:=Shl(o[],2)+o+4
  805.   pc:=o+4
  806.  
  807.   WriteF('\n')
  808.  
  809.   WHILE (pc < number)
  810.     hibyte:=Shr(Char(pc),4)
  811.     eleven2nine:=Shr(Char(pc),1) AND 7
  812.     eight:=Char(pc) AND 1
  813.     seven2six:=Shr(Char(pc+1),6) AND 3
  814.     five2three:=Shr(Char(pc+1),3) AND 7
  815.     two2zero:=Char(pc+1) AND 7
  816.  
  817.     IF CtrlC() THEN error(ER_BREAK)             /* essential! */
  818.  
  819.     WriteF('L\z\h[8]:',pc-o-4)                  /* for offsets */
  820.  
  821.     WriteF('\t')
  822.  
  823.     IF (hibyte > 0) AND (hibyte < 4)
  824.       WriteF(IF (eight=0) AND (seven2six=1) THEN 'movea.' ELSE 'move.')
  825.       SELECT hibyte
  826.         CASE 1; WriteF('b')
  827.         CASE 2; WriteF('l'); isize:=4
  828.         CASE 3; WriteF('w')
  829.       ENDSELECT
  830.       WriteF('\t')
  831.       ea(five2three,two2zero,1)
  832.       WriteF(',')
  833.       ea(Shl(eight,2)+seven2six,eleven2nine,0)
  834.       WriteF('\n')
  835.       isize:=2
  836.     ELSE
  837.       SELECT hibyte
  838.         CASE 0;                 /* Bit Manipulation/MOVEP/immediate */
  839.           code0000()
  840.         CASE 4;                 /* Miscellaneous */
  841.           code0100()
  842.         CASE 5;                 /* ADDQ/SUBQ/Scc/DBcc/TRAPcc */
  843.           code0101()
  844.         CASE 6;                 /* Bcc/BSR/BRA/MOVEC */
  845.           code0110()
  846.         CASE 7;                 /* MOVEQ */
  847.           WriteF('moveq\t#')
  848.           immed(Char(pc+1))
  849.           WriteF(',d\d\n',eleven2nine)
  850.         CASE 8;                 /* OR/DIV/SBCD */
  851.           code1000()
  852.         CASE 9;                 /* SUB/SUBA/SUBX */
  853.           code1001()
  854.         CASE 10;                /* (unassigned, reserved) */
  855.           illegal()
  856.         CASE 11;                /* CMP/EOR */
  857.           code1011()
  858.         CASE 12;                /* AND/MUL/ABCD/EXG */
  859.           code1100()
  860.         CASE 13;                /* ADD/ADDX */
  861.           code1101()
  862.         CASE 14;                /* Shift/Rotate/Bit Field */
  863.           code1110()
  864.         CASE 15;                /* Coprocessor Interface */
  865.           illegal()
  866.       ENDSELECT
  867.     ENDIF
  868.     pc++
  869.   ENDWHILE
  870.  
  871.   WriteF('\n')
  872.  
  873.   o:=number
  874. ENDPROC
  875.  
  876.